﻿
namespace Copy
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Transactions;
    using System.IO;
    /// <summary>
    /// Класс создания копий файлов.
    /// </summary>
    public class CopyFile
    {       
        /// <summary>
        /// Метод удаления файла по его имени.
        /// </summary>
        /// <param name="sourcePath">Путь к папке</param>
        /// <param name="filename">Имя файла</param>
        /// <returns>Логическое значение, true-если произошло удаление, false в противном случае.</returns>
        public bool DeleteOneFileFromDirectory(string sourcePath,string filename)
        {
            string targetPath = System.IO.Path.Combine(sourcePath, filename);

            if (System.IO.File.Exists(targetPath))
            {
                try
                {
                    System.IO.File.Delete(targetPath);
                }
                catch (System.IO.IOException e)
                {
                    Console.WriteLine(e.Message);
                    return false;
                }
                return true;
            }
            else
            {
                Console.WriteLine("Source file does not exist!");
                return false;
            }
        }
        /// <summary>
        /// Метод удаления файлов из директории.
        /// </summary>
        /// <param name="sourcePath">Путь к директории</param>
        /// <returns>Логическое значение, true-если произошло удаление, false в противном случае.</returns>
        private bool DeleteFilesFromDirectory(string sourcePath)
        {
            string fileName;
            string targetPath;
            if (System.IO.Directory.Exists(sourcePath))
            {
                string[] files = System.IO.Directory.GetFiles(sourcePath);
                foreach (string s in files)
                {
                    fileName = System.IO.Path.GetFileName(s);
                    targetPath = System.IO.Path.Combine(sourcePath, fileName);

                    if (System.IO.File.Exists(targetPath))
                    {
                        try
                        {
                            System.IO.File.Delete(targetPath);
                        }
                        catch (System.IO.IOException e)
                        {
                            Console.WriteLine(e.Message);
                            return false;
                        }
                    }
                }
                return true;
            }
            else
            {
                Console.WriteLine("Source file does not exist!");
                return false;
            }
        }

        /// <summary>
        /// Метод копирования файлов из одной папки в другую.
        /// </summary>
        /// <param name="sourcePath">Исходная папка</param>
        /// <param name="targetPath">Конечная папка</param>
        /// <returns>Количество скопированных файлов, если ошибка возвращает -1</returns>
        public int Copy(string sourcePath, string targetPath)
        {
            string destFile;
            string fileName;
            string sourceFile;
            string dir;
            DriveInfo driveInfo;
            FileInfo Info;
            if (System.IO.Directory.Exists(sourcePath))
            {
                
                   
                        string[] filesSourcePath = System.IO.Directory.GetFiles(sourcePath);
                        string[] filesTargetPath = System.IO.Directory.GetFiles(targetPath);
                        if ((filesSourcePath.Length < filesTargetPath.Length) || (filesSourcePath.Length == filesTargetPath.Length) || (filesSourcePath.Length > filesTargetPath.Length))
                        {
                            try
                            {

                                foreach (string s in filesSourcePath)
                                {
                                    using (TransactionScope scope = new TransactionScope())
                                    {

                                        // Use static Path methods to extract only the file name from the path.
                                            fileName = System.IO.Path.GetFileName(s);
                                            dir = System.IO.Path.GetPathRoot(s);
                                            destFile = System.IO.Path.Combine(targetPath, fileName);
                                            sourceFile = System.IO.Path.Combine(sourcePath, fileName);
                                            driveInfo = new DriveInfo(dir);                                            
                                            Info = new FileInfo(sourceFile);
                                            if (Info.Length > driveInfo.TotalFreeSpace)
                                                break;
                                            else
                                            {
                                                try
                                                {
                                                    System.IO.File.Copy(s, destFile, true);
                                                }
                                                catch (System.UnauthorizedAccessException)
                                                {
                                                    break;
                                                }
                                                catch (System.IO.IOException)
                                                {
                                                    break;
                                                }
                                                scope.Complete();
                                                scope.Dispose();
                                            } 
                                    }
                                }
                            }
                            catch (TransactionAbortedException ex)
                            {
                                Console.Write(ex.Message);
                                return -1;
                            }
                            
                        }                       
                        return filesSourcePath.Length;                    
                }

            else
            {
                Console.WriteLine("Source path does not exist!");

                return -1;
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}
